package edu.ustb.aur.rightpackage;

import java.util.HashMap;

import edu.ustb.aur.myenum.OperateEnum;
import edu.ustb.aur.myenum.RightEnum;
import edu.ustb.aur.utils.PercentageOperate;

/**
 * @author 占有权
 */
public class PossessRight extends AbstractRight {
    /**
     * 标明权利类型,便于反序列化时使用
     */
    public final RightEnum type = RightEnum.POSSESS_RIGHT;

    /**
     * 默认构造函数
     */
    public PossessRight() {
        // 调用父类构造函数
        super();
    }

    /**
     * 带参构造函数
     * 
     * @param rightMap
     *            人与权占比对应map
     * @param isSplit
     *            是否可分
     */
    public PossessRight(HashMap<String, Double> rightMap, boolean isSplit) {
        // 调用父类构造函数
        super(rightMap, isSplit);
    }

    /**
     * 权利初始化
     *
     * @param userAddress
     *            用户链上地址，唯一索引
     * @param percentage
     *            百分比
     */
    @Override
    public void initRight(String userAddress, double percentage) {

        // 权利不可分，传入的percentage必是1.0
        if (!this.getIsSpilt()) {
            if (PercentageOperate.notEqual(percentage, 1.0)) {
                return;
            }
        }

        boolean b = ifLogic(this.rightMap, userAddress, OperateEnum.ADD_OPERATE, percentage);
        if (b) {
            System.out.println("占有权初始化成功");
        } else {
            System.out.println("初始化发生错误！！！");
        }
    }

    /**
     * 权利转移
     *
     * @param from
     *            转移者
     * @param to
     *            接收者
     * @param percentage
     *            百分比
     */
    @Override
    public void transferRight(String from, String to, double percentage) {

        // 权利不可分，传入的percentage必是1.0
        if (!this.getIsSpilt()) {
            if (PercentageOperate.notEqual(percentage, 1.0)) {
                return;
            }
        }

        // 1.比较转移者权利百分比与需要转移百分比的关系
        if (PercentageOperate.compare(percentage, rightMap.get(from))) {
            System.out.println("转移者百分比小于需要转移百分比，转移失败");
        }
        if (PercentageOperate.equal(rightMap.get(from), percentage)) {
            boolean b = ifLogic(this.rightMap, from, OperateEnum.DELETE_OPERATE, percentage);
            if (b) {
                System.out.println("转移者删除成功");
            } else {
                System.out.println("转移者删除发生错误！！！");
            }
        } else {
            boolean b = ifLogic(this.rightMap, from, OperateEnum.UPDATE_OPERATE, -percentage);
            if (b) {
                System.out.println("转移者更新成功");
            } else {
                System.out.println("转移者更新发生错误！！！");
            }
        }
        // 2.判断接收者是否存在
        if (rightMap.containsKey(to)) {
            boolean b1 = ifLogic(this.rightMap, to, OperateEnum.UPDATE_OPERATE, percentage);
            if (b1) {
                System.out.println("接收者更新成功");
            } else {
                System.out.println("接收者更新发生错误！！！");
            }
        } else {
            boolean b1 = ifLogic(this.rightMap, to, OperateEnum.ADD_OPERATE, percentage);
            if (b1) {
                System.out.println("接收者添加成功");
            } else {
                System.out.println("接收者添加发生错误！！！");
            }
        }
    }

    /**
     * 权利注销
     *
     * @param userAddress
     *            用户链上地址，唯一索引
     * @param percentage
     *            百分比
     */
    @Override
    public void deleteRight(String userAddress, double percentage) {

        // 权利不可分，传入的percentage必是1.0
        if (!this.getIsSpilt()) {
            if (PercentageOperate.notEqual(percentage, 1.0)) {
                return;
            }
        }

        boolean b = ifLogic(this.rightMap, userAddress, OperateEnum.DELETE_OPERATE, percentage);
        if (b) {
            System.out.println("占有权删除成功");
        } else {
            System.out.println("删除发生错误！！！");
        }
    }
}
